<?php
// 应用公共文件

/* 
============================ 自己定义函数 ==================================================
*/

if (!function_exists('get')) {
    /**
     * 发送GET请求
     * @param string $url 请求地址
     * @param array $urlParams URL参数
     * @param array $header 请求头
     * @return array|string|false 返回数组(JSON解析成功)/原始响应内容/失败返回false
     */
    function get($url, $params = [], $header = [])
    {
        // 初始化cURL句柄
        $curl = curl_init();

        // 验证并设置CA证书路径
        $caPath = realpath(dirname(__DIR__, 1) . '/public/CA/cacert.pem');
        if (!$caPath || !file_exists($caPath)) {
            return ['error' => 'CA证书文件不存在或路径错误：' . $caPath];
        }
        curl_setopt($curl, CURLOPT_CAINFO, $caPath);

        // 构建完整请求URL
        $queryString = http_build_query($params);
        $fullUrl = $url . ($queryString ? "?{$queryString}" : '');

        // 配置cURL选项
        curl_setopt_array($curl, [
            CURLOPT_URL            => $fullUrl,
            CURLOPT_RETURNTRANSFER  => true,    // 返回响应内容而不直接输出
            CURLOPT_ENCODING       => '',      // 自动处理所有支持的编码类型
            CURLOPT_MAXREDIRS      => 10,      // 最大重定向次数
            CURLOPT_TIMEOUT         => 30,      // 超时时间（秒）
            CURLOPT_HTTP_VERSION    => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST   => 'GET',
            CURLOPT_HTTPHEADER      => $header, // 自定义请求头
            CURLOPT_SSL_VERIFYPEER  => true,    // 验证SSL证书
            CURLOPT_SSL_VERIFYHOST => 2        // 验证主机名与证书匹配
        ]);

        // 执行请求并获取响应
        $response = curl_exec($curl);

        // 错误处理
        if ($response === false) {
            $errorMsg = 'cURL错误: ' . curl_error($curl);
            curl_close($curl);
            return ['error' => $errorMsg];
        }

        // 获取HTTP状态码（可用于扩展处理）
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);

        // 尝试解析JSON响应
        $decoded = json_decode($response, true);
        return (json_last_error() === JSON_ERROR_NONE)
            ? $decoded     // 返回解析后的JSON数据
            : $response;   // 返回原始响应内容
    }
}


if (!function_exists('post')) {
    /**
     * 发送POST请求
     * @param string $url 请求地址
     * @param array|string $postData 请求体数据
     * @param array $urlParams URL参数
     * @param array $header 请求头
     * @return array|string|false 返回数组(JSON解析成功)/原始响应内容/失败返回false
     */
    function post($url, $postData, $params = [], $header = [])
    {
        $curl = curl_init();

        // CA证书验证（与get()相同）
        $caPath = realpath(dirname(__DIR__, 1) . '/public/CA/cacert.pem');
        if (!$caPath) {
            return ['error' => 'CA证书文件不存在'];
        }
        curl_setopt($curl, CURLOPT_CAINFO, $caPath);

        // 构建完整URL
        $fullUrl = $url . (empty($params) ? '' : '?' . http_build_query($params));

        // 智能设置Content-Type
        $hasContentType = false;
        foreach ($header as $h) {
            if (stripos($h, 'Content-Type:') === 0) {
                $hasContentType = true;
                break;
            }
        }

        if (!$hasContentType) {
            if (is_string($postData)) {
                $header[] = 'Content-Type: application/json';
            } elseif (is_array($postData)) {
                $header[] = 'Content-Type: application/x-www-form-urlencoded';
            }
        }

        // 处理POST数据
        $postContent = is_array($postData)
            ? http_build_query($postData)
            : $postData;

        // 配置cURL选项
        curl_setopt_array($curl, [
            CURLOPT_URL            => $fullUrl,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING      => '',
            CURLOPT_MAXREDIRS      => 10,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST  => 'POST',
            CURLOPT_POSTFIELDS     => $postContent,
            CURLOPT_HTTPHEADER     => $header,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_SSL_VERIFYHOST => 2
        ]);

        // 执行请求
        $response = curl_exec($curl);

        // 错误处理
        if ($response === false) {
            $errorMsg = 'cURL错误: ' . curl_error($curl);
            $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            curl_close($curl);
            return ['error' => "[{$httpCode}] {$errorMsg}"];
        }

        // 关闭连接并处理响应
        curl_close($curl);

        // JSON解析（与get()保持相同逻辑）
        $decoded = json_decode($response, true);
        return (json_last_error() === JSON_ERROR_NONE)
            ? $decoded
            : $response;
    }
}